﻿// Gateway.Api 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
// 
// 本项目主要遵循 MIT 许可证和 Apache 许可证（版本 2.0）进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
// 
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动！任何基于本项目二次开发而产生的一切法律纠纷和责任，我们不承担任何责任！

using Aurora.AI.Common.Constants;
using Aurora.AI.Wiki.Domain.Domain.Wikis.Repositories;
using SqlSugar;

namespace Aurora.AI.Wiki.Services.Wiki;

/// <summary>
/// wiki service
/// </summary>
/// <param name="wikiRepository"></param>
public class WikiService(IWikiRepository wikiRepository)
{
    /// <summary>
    /// 创建
    /// </summary>
    /// <param name="wiki"></param>
    /// <returns></returns>
    public async Task<bool> Create(Domain.Domain.Wikis.Aggregates.Wiki wiki)
    {
        // 只插入 名称 图标  模型 嵌入模型
        var entity = new Domain.Domain.Wikis.Aggregates.Wiki(wiki.Icon, wiki.Name, wiki.Model, wiki.EmbeddingModel)
        {
            Creator = wiki.Creator,
            VectorType = wiki.VectorType
        };
        if (string.IsNullOrEmpty(entity.VectorType))
        {
            entity.VectorType = VectorType.None;
        }

        return await wikiRepository.InsertAsync(entity);
    }

    /// <summary>
    /// 更新 (包含 配置)
    /// </summary>
    /// <param name="wiki"></param>
    /// <returns></returns>
    /// <exception cref="ArgumentException"></exception>
    public async Task<bool> Update(Domain.Domain.Wikis.Aggregates.Wiki wiki)
    {
        // 只插入 名称 图标  模型 嵌入模型
        var entity = await wikiRepository.GetByIdAsync(wiki.Id);
        if (entity is null)
        {
            throw new ArgumentException("知识库未找到");
        }

        entity.Icon = wiki.Icon;
        entity.Name = wiki.Name;
        entity.Model = wiki.Model;
        entity.EmbeddingModel = wiki.EmbeddingModel;
        entity.Modifier = wiki.Modifier;
        entity.ModificationTime = DateTime.Now;
        entity.VectorType = wiki.VectorType;
        if (string.IsNullOrEmpty(entity.VectorType))
        {
            entity.VectorType = VectorType.None;
        }

        return await wikiRepository.UpdateAsync(entity);
    }

    /// <summary>
    /// 删除
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public async Task<bool> Remove(string id)
    {
        return await wikiRepository.DeleteAsync(id);
    }


    public async Task<Domain.Domain.Wikis.Aggregates.Wiki> GetByIdAsync(string id)
    {
        var entity = await wikiRepository.GetByIdAsync(id);
        return entity;
    }

    public async Task<List<Domain.Domain.Wikis.Aggregates.Wiki>> GetByIdsAsync(List<string> ids)
    {
        var entity = await wikiRepository.GetListAsync(x => ids.Contains(x.Id));
        return entity;
    }

    public async Task<List<Domain.Domain.Wikis.Aggregates.Wiki>> GetAvailableList()
    {
        return (await wikiRepository.GetListAsync(x => x.IsDeleted == false)).OrderByDescending(x => x.CreationTime)
            .ToList();
    }

    public async Task<(List<Domain.Domain.Wikis.Aggregates.Wiki> list, int total)> PageList(int page, int size)
    {
        (int total, List<Domain.Domain.Wikis.Aggregates.Wiki> list) pageListAsync =
            await wikiRepository.GetPageListAsync(x => true, page, size, orderExpression: x => x.CreationTime,
                OrderByType.Desc);
        return (pageListAsync.list, pageListAsync.total);
    }
}